// DataLibrary FunctionPlugin - ProfileText

// 識別子：DL_PRFD
// 内容  ：プロフィール文章。

//----------------------------------------------------------------------------//
// Plugin
//----------------------------------------------------------------------------//

//-- プラグインの読み込み処理 --//
//DL_LoadFunction_ProfileText:
//Return


//-- プラグインの終了処理 --//
//DL_UnloadFunction_ProfileText:
//Return


//----------------------------------------------------------------------------//
// ProfileText Optimize
//----------------------------------------------------------------------------//

//-- UnSetOptimize : 文章最適化用変数を削除する --//
DL_PRFD_UnSetOptimize:
	If Count(DL_PRFD_ColorStack) > 0 Then
		Set DL_FontColor["Normal"] DL_PRFD_ColorStack[1]
	EndIf
	UnSet DL_PRFD_HeaderTag
	UnSet DL_PRFD_LinkCount
	UnSet DL_PRFD_LinkSetting
	UnSet DL_PRFD_ColorStack
	UnSet DL_PRFD_FontStack
Return


//-- SetProfileText data_id text : 文章を設定する --//
DL_PRFD_SetProfileText:
	Local data_id = Args(1)
	Local text = Args(2)
	
	// 空文字列の場合は空行を設定して終了する
	If text = "" Then
		Local line_cnt = DL_PRFD_Text[data_id, 0] + 1
		Set DL_PRFD_Text[data_id, 0] line_cnt
		Set DL_PRFD_Text[data_id, line_cnt] ""
		Return
	EndIf
	
	If Not IsVarDefined(DL_PRFD_HeaderTag) Then
		Set DL_PRFD_HeaderTag "$HEAD$"
	EndIf
	
	// タグが存在する場合はタグ文章処理のサブルーチンに移る
	If DL_GetOptionValue("ProfileTextTag", 1) And (InStr(text, "<") > 0) Then
		
		// コンフィグでタグ機能を停止されている場合はタグを取り除いて通常文章として処理する
		If DL_GetConfigValue("PRFD_TAG", 1) = 0 Then
			Call DL_PRFD_OptimizeTextNormal data_id DL_PRFD_ConvertTag(text)
		Else
			Call DL_PRFD_OptimizeTextTag data_id text
		EndIf
	Else
		// 通常文章を処理する
		Call DL_PRFD_OptimizeTextNormal data_id text
	EndIf
Return


//-- OptimizeTextNormal data_id text : 通常文章を最適化して設定する --//
DL_PRFD_OptimizeTextNormal:
	Local data_id = Args(1)
	Local text = Args(2)
	Local header_tag = IIf(DL_PRFD_HeaderTag != "$HEAD$", DL_PRFD_HeaderTag, "")
	
	// 指定幅で分割して格納する
	Local line_cnt = DL_PRFD_Text[data_id, 0] + 1
	Local text_len = Len(text)
	Local text_p = 1
	Local width = DL_PRFD_TextWidth - TextWidth("■") \ 2
	Local str
	Do While (text_p <= text_len)
		str = DL_PRFD_CutString(Mid(text, text_p), width)
		Set DL_PRFD_Text[data_id, line_cnt] (header_tag & str)
		Incr text_p Len(str)
		Incr line_cnt 1
	Loop
	
	// 行数を設定する
	Set DL_PRFD_Text[data_id, 0] (line_cnt - 1)
Return


//-- OptimizeTextTag data_id text : タグ付き文章を最適化して設定する --//
DL_PRFD_OptimizeTextTag:
	Local data_id = Args(1)
	Local text = Args(2)
	Local line_cnt = DL_PRFD_Text[data_id, 0] + 1
	Local str
	
	// タグ付き文章を最適化して設定する
	Set DL_PRFD_TextData IIf(DL_PRFD_HeaderTag != "$HEAD$", DL_PRFD_HeaderTag, "")
	Set DL_PRFD_TextP 1
	Set DL_PRFD_TextLen Len(text)
	Set DL_PRFD_TextSpace (TextWidth("■") \ 2)
	Set DL_PRFD_TextWidthLimit (DL_PRFD_TextWidth - DL_PRFD_TextSpace)
	
	Do While (DL_PRFD_TextP <= DL_PRFD_TextLen)
		// 未処理の文字列を取り出す
		str = Mid(text, DL_PRFD_TextP)
		
		// タグを処理する
		If Left(str, 1) = "<" Then
			Call DL_PRFD_OptimizeTag str line_cnt
			If DL_PRFD_TextWidthLimit != -1 Then
				Skip
			EndIf
		EndIf
		
		// 文字列が指定幅を超えた場合は次の行に移る
		If DL_PRFD_TextWidthLimit < 0 Then
			If InStr(str, "<") = 0 Then
				Break  // 以降の文字列にタグ記号が含まれていない場合はループを終了する
			EndIf
			
			Set DL_PRFD_Text[data_id, line_cnt] DL_PRFD_TextData
			Set DL_PRFD_TextData IIf(DL_PRFD_HeaderTag != "$HEAD$", DL_PRFD_HeaderTag, "")
			Set DL_PRFD_TextWidthLimit (DL_PRFD_TextWidth - DL_PRFD_TextSpace)
			Incr line_cnt 1
			Skip
		EndIf
		
		// 次のタグまでの文字列を取得する
		str = DL_PRFD_CutString(RegExp(str, "[^<]+"), DL_PRFD_TextWidthLimit)
		If str != "" Then
			Set DL_PRFD_TextData (DL_PRFD_TextData & str)
			Incr DL_PRFD_TextP Len(str)
			Incr DL_PRFD_TextWidthLimit (TextWidth(str) * -1)
		Else
			Set DL_PRFD_TextWidthLimit -1
		EndIf
	Loop
	
	// 残った最適化済みの文章と行数を設定する
	Set DL_PRFD_Text[data_id, line_cnt] DL_PRFD_TextData
	Set DL_PRFD_Text[data_id, 0] line_cnt
	
	// 最後まで最適化されていない場合は残りを通常文章の処理で行う
	If DL_PRFD_TextP <= DL_PRFD_TextLen Then
		Call DL_PRFD_OptimizeTextNormal data_id Mid(text, DL_PRFD_TextP)
	EndIf
	
	UnSet DL_PRFD_TextData
	UnSet DL_PRFD_TextP
	UnSet DL_PRFD_TextLen
	UnSet DL_PRFD_TextSpace
	UnSet DL_PRFD_TextWidthLimit
Return


//-- OptimizeTag tag : タグを最適化して設定する --//
DL_PRFD_OptimizeTag:
	Local tag = RegExpReplace(Args(1), "<(.*?)>.*", "$1")
	Local data = ""
	
	// 次の通常文字で改行される場合は改行してから処理する
	If (Not tag Like "[lgLG][tT]") And (Left(tag, 1) != "/") Then
		Local text = Left(RegExpReplace(Args(1), "<.*?>", ""), 1)
		If DL_PRFD_TextWidthLimit < TextWidth(text) Then
			If DL_PRFD_TextRule("", text) = "" Then
				Set DL_PRFD_TextWidthLimit -1
				Return
			EndIf
		EndIf
	EndIf
	
	// タグの分だけポインタを進める
	Incr DL_PRFD_TextP (Len(tag) + 2)
	
	// タグ名とデータに分割する
	If tag Like "*=*" Then
		data = RegExpReplace(tag, ".*=\s*(.*?)\s*$", "$1")
		tag = RegExpReplace(tag, "^\s*(.*?)\s*=.*", "$1")
	EndIf
	
	// タグを最適化して設定する
	Switch LCase(tag)
	Case "lt" "gt"
		// 範囲を超える場合は改行してから処理する
		If DL_PRFD_TextWidthLimit < TextWidth("<") Then
			Set DL_PRFD_TextWidthLimit -1
			Return
		EndIf
		Set DL_PRFD_TextData (DL_PRFD_TextData & "<" & LCase(tag) & ">")
		Incr DL_PRFD_TextWidthLimit (TextWidth("<") * -1)
		Return
	Case "link"
		data = DL_ConvertListData(data, ",")
		Local data_id = LIndex(data, 1)
		Local lib_idx = DL_PRF_LinkInfo[data_id]
		
		If DL_GetFlag(data_id, LIndex(lib_idx, 1)) = 0 Then
			Return  // フラグが存在しなければ設定しない
		EndIf
		Set DL_PRFD_LinkSetting 1
		
		// LinkDataを設定する <link (LINK_ID DATA_ID) (CAPTION)>
		Incr DL_PRFD_LinkCount 1
		tag = "<link (" & DL_PRFD_LinkCount & " " & data_id & ")"
		If LLength(data) = 1 Then
			tag = tag & " (" & DL_GetLibItemData(LIndex(lib_idx, 1), LIndex(lib_idx, 2), 1) & ")>"
		Else
			tag = tag & " (" & LIndex(data, 2) & ")>"
		EndIf
		
		Set DL_PRFD_TextData (DL_PRFD_TextData & tag)
		Call DL_PRFD_AddHeaderTag tag "Text"
		Return
	Case "/link"
		If Not IsVarDefined(DL_PRFD_LinkSetting) Then
			Return  // リンク設定がされていない場合は設定しない
		EndIf
		UnSet DL_PRFD_LinkSetting
		Set DL_PRFD_TextData (DL_PRFD_TextData & "</link>")
		Call DL_PRFD_RemoveHeaderTag "link"
		Return
	Case "ruby"
		// 対象文字列を取り出す
		Local str = RegExpReplace(Args(1), "<.*?>(.*?)</ruby>.*", "$1", "大小区別なし")
		If InStr(str, "<") > 0 Then
			str = DL_PRFD_ConvertTag(str)  // タグが含まれる場合は取り除く
		EndIf
		If str = "" Then
			Return
		EndIf
		
		// 表示基準位置と対象文字列の幅とふりがな文字列を記録する
		Local px = DL_PRFD_TextWidth - (DL_PRFD_TextWidthLimit + DL_PRFD_TextSpace)
		data = "(" & DL_FontColor["Normal"] & ") (" & px & ") (" & TextWidth(str) & ") (" & data & ")"
		tag = "<ruby " & data & ">"
		
		// 文章先頭にタグを追加する
		If InStr(DL_PRFD_TextData, "<ruby") > 0 Then
			// 複数のRubyタグは一つに纏める
			Set DL_PRFD_TextData RegExpReplace(DL_PRFD_TextData, "(<ruby.*?)>", "$1 " & data & ">")
		ElseIf InStr(DL_PRFD_TextData, "$HEAD$") > 0 Then
			Set DL_PRFD_TextData Replace(DL_PRFD_TextData, "$HEAD$", "$HEAD$" & tag)
		Else
			Set DL_PRFD_TextData (tag & DL_PRFD_TextData)
		EndIf
		Return
	Case "/ruby"
		Return  // 不要なので無視する
	Case "color"
		// 文字色を設定する
		data = Eval("List(" & data & ")")
		If LLength(data) = 1 Then
			data = Eval(LIndex(data, 1)) & " " & LIndex(DL_FontColor["Normal"], 2)
		Else
			data = Eval(LIndex(data, 1)) & " " & Eval(LIndex(data, 2))
		EndIf
		Set DL_PRFD_TextData (DL_PRFD_TextData & "<color (" & data & ")>")
		Call DL_PRFD_AddHeaderTag ("<color (" & data & ")>")
		
		// 現在の文字色を保存してから変更する
		Set DL_PRFD_ColorStack[Count(DL_PRFD_ColorStack) + 1] DL_FontColor["Normal"]
		Set DL_FontColor["Normal"] data
		Return
	Case "/color"
		Set DL_PRFD_TextData (DL_PRFD_TextData & "</color>")
		Call DL_PRFD_RemoveHeaderTag "color"
		
		// 文字色を一段階元に戻す
		Set DL_FontColor["Normal"] DL_PRFD_ColorStack[Count(DL_PRFD_ColorStack)]
		UnSet DL_PRFD_ColorStack[Count(DL_PRFD_ColorStack)]
		Return
	Case "font"
		Set DL_PRFD_TextData (DL_PRFD_TextData & "<font (" & data & ")>")
		Call DL_PRFD_AddHeaderTag ("<font (" & data & ")>")
		
		// 現在のフォント名を保存してから変更する
		Set DL_PRFD_FontStack[Count(DL_PRFD_FontStack) + 1] Font("フォント名")
		Font data
		Return
	Case "/font"
		Set DL_PRFD_TextData (DL_PRFD_TextData & "</font>")
		Call DL_PRFD_RemoveHeaderTag "font"
		
		// フォント名を一段階元に戻す
		Font DL_PRFD_FontStack[Count(DL_PRFD_FontStack)]
		UnSet DL_PRFD_FontStack[Count(DL_PRFD_FontStack)]
		Return
	Case "b"
		Set DL_PRFD_TextData (DL_PRFD_TextData & "<b>")
		Call DL_PRFD_AddHeaderTag "<b>"
		Font Bold
		Return
	Case "/b"
		Set DL_PRFD_TextData (DL_PRFD_TextData & "</b>")
		Call DL_PRFD_RemoveHeaderTag "b"
		If Font("斜体") = 1 Then
			Font Regular Italic  // 斜体を考慮して戻す
		Else
			Font Regular
		EndIf
		Return
	Case "i"
		Set DL_PRFD_TextData (DL_PRFD_TextData & "<i>")
		Call DL_PRFD_AddHeaderTag "<i>"
		Font Italic
		Return
	Case "/i"
		Set DL_PRFD_TextData (DL_PRFD_TextData & "</i>")
		Call DL_PRFD_RemoveHeaderTag "i"
		If Font("太字") = 1 Then
			Font Regular Bold  // 太字を考慮して戻す
		Else
			Font Regular
		EndIf
		Return
	EndSw
Return


//-- CutString(string, width) : 指定した幅で文字列を取り出して返す --//
DL_PRFD_CutString:
	Local str = Args(1)
	Local width = Args(2)

	// 範囲内ならそのまま返す
	If TextWidth(str) <= width Then
		Return str
	EndIf
	
	// 一文字目で幅を超えるなら禁則処理だけ行う
	If TextWidth(Left(str, 1)) > width Then
		Return DL_PRFD_TextRule("", str)
	EndIf
	
	// 飛び幅を3に設定する
	Local gap = 3
	Local str_p = gap
	
	// 指定された幅を超えた位置までポインタを進める
	Do While (TextWidth(Left(str, str_p)) < width)
		Incr str_p gap
	Loop
	
	// 超えた分を一文字ずつ削っていく
	str_p = Min(str_p, Len(str))
	Do While (TextWidth(Left(str, str_p)) > width)
		Incr str_p -1
	Loop
Return DL_PRFD_TextRule(Left(str, str_p), Mid(str, str_p + 1))


//-- TextRule(str1, str2) : 禁則処理を行う --//
DL_PRFD_TextRule:
	Local str = Args(1)
	Local next_str = Args(2)
	
	If DL_GetOptionValue("ProfileTextRule", 1) = 0 Then
		Return str  // オプションで禁則処理をOFFにされている場合は終了する
	EndIf
	
	// 行末の始め括弧を追い出し処理する
	Switch Right(str, 1)
	Case "「" "『" "【" "（" "［" "｛" "‘" "“" _
			"｢" "(" "[" "{" "'" `"`
		Return Left(str, Len(str) - 1)
	EndSw
	
	// 行頭の句読点、終わり括弧をぶら下げ処理する
	Switch Mid(next_str, 1, 1)
	Case "、" "。" "，" "．" "」" "』" "】" "）" "］" "｝" "’" "”" _
			 "､" "｡" "," "." "｣" ")" "]" "}" "'" `"`
		Return (str & Mid(next_str, 1, 1))
	EndSw
Return str


//-- ConvertTag(string) : タグを通常テキストに変換する --//
DL_PRFD_ConvertTag:
	Local str = RegExpReplace(Args(1), "<([lLgG][tT])>", "\_$1_\")  // <LT><GT>を保護する
	str = RegExpReplace(str, "<.*?>", "")                           // タグを消去する
	str = RegExpReplace(str, "\\_[lL][tT]_\\", "<")                 // <LT>を処理する
Return RegExpReplace(str, "\\_[gG][tT]_\\", ">")                    // <GT>を処理する


//-- AddHeaderTag tag [mode] : タグリストに追加する --//
DL_PRFD_AddHeaderTag:
	If Args(2) = "Text" Then
		Set DL_PRFD_HeaderTag (DL_PRFD_HeaderTag & Args(1))
	Else
		Set DL_PRFD_HeaderTag Replace(DL_PRFD_HeaderTag, "$HEAD$", Args(1) & "$HEAD$")
	EndIf
Return


//-- RemoveHeaderTag tag : タグリストから取り除く --//
DL_PRFD_RemoveHeaderTag:
	Set DL_PRFD_HeaderTag RegExpReplace(DL_PRFD_HeaderTag, "(.*)<" & Args(1) & ".*?>(.*)$", "$1$2")
Return


//----------------------------------------------------------------------------//
// ProfileText Draw
//----------------------------------------------------------------------------//

//-- UnSetDraw : 文章描画用変数を削除する --//
DL_PRFD_UnSetDraw:
	UnSet DL_PRFD_DrawFirstLine
	UnSet DL_PRFD_ColorStack
	UnSet DL_PRFD_FontStack
Return


//-- DrawProfileText x y scroll_id data_id : 文章を表示する --//
DL_PRFD_DrawProfileText:
	Local px = Args(1)
	Local py = Args(2)
	Local scroll_id = Args(3)
	Local data_id = Args(4)
	Local i
	
	// オプション、コンフィグ設定を確認する
	Local tag_option = DL_GetOptionValue("ProfileTextTag", 1)
	Local tag_config = DL_GetConfigValue("PRFD_TAG", 1)
	Local tag_off = (tag_option = 0) Or (tag_config = 0)
	
	// 基礎フォント設定を呼び出す
	Call DL_PRFD_SetProfileTextFont
	
	// 文章の文字列を描画する
	For i = DL_ScrollFirst(scroll_id) To DL_ScrollLast(scroll_id)
		Call DL_PRFD_DrawText px py DL_PRFD_Text[data_id, i] tag_off
		Incr py 23
	Next
	
	// 色やフォントを元に戻す
	If Count(DL_PRFD_ColorStack) > 0 Then
		Set DL_FontColor["Normal"] DL_PRFD_ColorStack[1]
	EndIf
	Call DL_PRFD_SetProfileTextFont
	
	// 使用変数を削除する
	Call DL_PRFD_UnSetDraw
Return


//-- DrawText x y text [tag_off] : 文章の文字列を描画する --//
DL_PRFD_DrawText:
	If Args(3) = "" Then
		Return  // 空文字列なら終了する
	EndIf
	
	Set DL_PRFD_TextData Args(3)  // 文字列を変数に格納する
	
	// 行をまたぐタグ効果を処理する
	If InStr(DL_PRFD_TextData, "$HEAD$") > 0 Then
		If Not IsVarDefined(DL_PRFD_DrawFirstLine) Then
			Set DL_PRFD_TextData Replace(DL_PRFD_TextData, "$HEAD$")
		Else
			Set DL_PRFD_TextData RegExpReplace(DL_PRFD_TextData, "^.*\$HEAD\$", "")
		EndIf
	EndIf
	Set DL_PRFD_DrawFirstLine 1
	
	// タグが存在しない場合は文字列を描画して終了する
	If (InStr(DL_PRFD_TextData, "<") = 0) Or (Args(4) = 1) Then
		Call DL_CMN_DrawString Args(1) Args(2) DL_PRFD_TextData
		UnSet DL_PRFD_TextData
		Return
	EndIf
	
	// タグ特殊効果文章を描画する
	Set DL_PRFD_TextP 1
	Set DL_PRFD_TextLen Len(DL_PRFD_TextData)
	Set DL_PRFD_TextX Args(1)
	Set DL_PRFD_TextY Args(2)
	
	Local str
	Do While (DL_PRFD_TextP <= DL_PRFD_TextLen)
		// 未処理の文字列を取り出す
		str = Mid(DL_PRFD_TextData, DL_PRFD_TextP)
		
		// タグを処理する
		If Left(str, 1) = "<" Then
			Call DL_PRFD_DrawTag str
			Skip
		EndIf
		
		// 次のタグまでの文字列を取り出す
		str = RegExp(str, "[^<]+")
		If str != "" Then
			Call DL_CMN_DrawString DL_PRFD_TextX DL_PRFD_TextY str
			Incr DL_PRFD_TextX TextWidth(str)
			Incr DL_PRFD_TextP Len(str)
		EndIf
	Loop
	
	UnSet DL_PRFD_TextData
	UnSet DL_PRFD_TextP
	UnSet DL_PRFD_TextLen
	UnSet DL_PRFD_TextX
	UnSet DL_PRFD_TextY
Return


//-- DrawTag tag : タグ効果を処理する --//
DL_PRFD_DrawTag:
	Local tag = RegExpReplace(Args(1), "<(.*?)>.*", "$1")
	Local data
	
	// タグの分だけポインタを進める
	Incr DL_PRFD_TextP (Len(tag) + 2)
	
	// タグを最適化して設定する
	Switch LIndex(tag, 1)
	Case "lt" "gt"
		Local str = IIf(LIndex(tag, 1) = "lt", "<", ">")
		Call DL_CMN_DrawString DL_PRFD_TextX DL_PRFD_TextY str
		Incr DL_PRFD_TextX TextWidth(str)
		Return
	Case "link"
		// リンクとして表示する文字列を取り出す
		Local str = Mid(DL_PRFD_TextData, DL_PRFD_TextP)
		If InStr(str, "</link>") > 0 Then
			str = Left(str, InStr(str, "</link>") - 1)
			Incr DL_PRFD_TextP 7
		EndIf
		If str = "" Then
			Return
		EndIf
		
		// リンクテキストを描画する
		Call DL_PRFD_DrawLinkText DL_PRFD_TextX DL_PRFD_TextY str LIndex(tag, 3) LIndex(tag, 2)
		Incr DL_PRFD_TextX TextWidth(str)
		Incr DL_PRFD_TextP Len(str)
		Return
	Case "ruby"
		// フォントの状態を記録する
		Local font_color = DL_FontColor["Normal"]
		Local font_size = Font("サイズ") & "pt"
		Local font_face = Font("フォント名")
		Local font_style = Font("太字") & Font("斜体")
		
		// ふりがな用のフォントを設定する
		Call DL_PRFD_SetProfileTextRubyFont
		If Count(DL_PRFD_ColorStack) > 0 Then
			Set DL_FontColor["Normal"] DL_PRFD_ColorStack[1]
		EndIf
		
		// ふりがなを描画する
		Local px i
		For i = 2 To LLength(tag) Step 4
			Set DL_FontColor["Normal"] LIndex(tag, i)
			px = DL_PRFD_TextX + LIndex(tag, i + 1)
			Call DL_PRFD_DrawRubyText px DL_PRFD_TextY LIndex(tag, i + 2) LIndex(tag, i + 3)
		Next
		
		// フォントの状態を復元する
		Call DL_PRFD_SetProfileTextFont
		Set DL_FontColor["Normal"] font_color
		Font font_size font_face
		If font_style Like "1#" Then
			Font Bold
		EndIf
		If font_style Like "#1" Then
			Font Italic
		EndIf
		Return
	Case "/link" "/ruby"
		Return  // 処理済みなので無視する
	Case "color"
		// 現在の文字色を保存してから変更する
		Set DL_PRFD_ColorStack[Count(DL_PRFD_ColorStack) + 1] DL_FontColor["Normal"]
		Set DL_FontColor["Normal"] LIndex(tag, 2)
		Return
	Case "/color"
		// 文字色を一段階元に戻す
		Set DL_FontColor["Normal"] DL_PRFD_ColorStack[Count(DL_PRFD_ColorStack)]
		UnSet DL_PRFD_ColorStack[Count(DL_PRFD_ColorStack)]
		Return
	Case "font"
		// 現在のフォント名を保存してから変更する
		Set DL_PRFD_FontStack[Count(DL_PRFD_FontStack) + 1] Font("フォント名")
		Font LIndex(tag, 2)
		Return
	Case "/font"
		// フォント名を一段階元に戻す
		Font DL_PRFD_FontStack[Count(DL_PRFD_FontStack)]
		UnSet DL_PRFD_FontStack[Count(DL_PRFD_FontStack)]
		Return
	Case "b"
		Font Bold
		Return
	Case "/b"
		If Font("斜体") = 1 Then
			Font Regular Italic  // 斜体を考慮して戻す
		Else
			Font Regular
		EndIf
		Return
	Case "i"
		Font Italic
		Return
	Case "/i"
		If Font("太字") = 1 Then
			Font Regular Bold  // 太字を考慮して戻す
		Else
			Font Regular
		EndIf
		Return
	EndSw
Return


//-- ClearLinkPoint : リンクのHotPointを消去する --//
DL_PRFD_ClearLinkPoint:
	Local i
	For i = 1 To Count(DL_PRFD_LinkData)
		ClearObj ("Link " & i)
	Next
	UnSet DL_PRFD_LinkData
Return


//-- DrawLinkText x y string caption link_data [color_data] : リンクテキストを描画する --//
DL_PRFD_DrawLinkText:
	Incr BaseX Args(1)
	Incr BaseY Args(2)
	
	Local str = Args(3)
	Local caption = Args(4)
	Local link_data = Args(5)
	Local color_data = IIf(DL_IsFlagUnread(LIndex(link_data, 2)), "Unread", "Point")
	If Args(6) != "" Then
		color_data = Args(6)
	EndIf
	
	Call DL_CMN_DrawString 0 0 str color_data
	Line 0 TextHeight(str) TextWidth(str) TextHeight(str) LIndex(DL_FontColor[color_data], 1)
	Line 0 (TextHeight(str) + 1) TextWidth(str) (TextHeight(str) + 1) LIndex(DL_FontColor[color_data], 2)
	
	If Not IsVarDefined(DL_PRFD_ContinueScroll) Then
		Local link_cnt = Count(DL_PRFD_LinkData) + 1
		Call DL_CMN_HotPoint ("Link " & link_cnt) 0 0 TextWidth(str) TextHeight(str) caption
		Set DL_PRFD_LinkData[link_cnt] List(link_data, BaseX, BaseY, str, Font("太字") & Font("斜体"))
	EndIf
	
	Incr BaseX (Args(1) * -1)
	Incr BaseY (Args(2) * -1)
Return


//-- DrawLinkTextAction action_id : リンクテキストの動作を行う --//
DL_PRFD_DrawLinkTextAction:
	Local link_data = DL_PRFD_LinkData[LIndex(Args(1), 2)]
	Local link_id = LIndex(link_data, 1)
	Local data str i
	
	Call DL_PRFD_SetProfileTextFont
	If LIndex(link_data, 6) Like "1#" Then
		Font Bold
	EndIf
	If LIndex(link_data, 6) Like "#1" Then
		Font Italic
	EndIf
	
	Set DL_PRFD_ContinueScroll 1
	For i = 1 To Count(DL_PRFD_LinkData)
		data = DL_PRFD_LinkData[i]
		If link_id < LIndex(data, 1) Then
			Break
		ElseIf link_id = LIndex(data, 1) Then
			Call DL_PRFD_DrawLinkText LIndex(data, 3) LIndex(data, 4) LIndex(data, 5) "" "" "Select"
		EndIf
	Next
	UnSet DL_PRFD_ContinueScroll
Return


//-- DrawRubyText x y width ruby : ふりがな付き文字列を描画する --//
DL_PRFD_DrawRubyText:
	Incr BaseX Args(1)
	Incr BaseY Args(2)
	
	Local width = Args(3)
	Local ruby = Args(4)
	
	// ふりながを描画する
	Call DL_CMN_DrawString ((width - TextWidth(ruby)) \ 2) (TextHeight(ruby) * -1) ruby
	
	Incr BaseX (Args(1) * -1)
	Incr BaseY (Args(2) * -1)
Return


